#include <iostream>
#include <cstdio>
#include <cstring>
#include <unistd.h>
#include <pthread.h>

void* routine(void* args)
{
    std::string name = static_cast<const char*>(args);
    while(true)
    {
        std::cout << "我是新线程..." << std::endl;
        sleep(1);
    }
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, routine, (void*)"thread");
    pthread_detach(tid);
    sleep(2);
    // pthread_cancel(tid);
    // std::cout << "取消线程: " << tid << std::endl;
    // sleep(2);//PTHREAD_CANCELED

    void* ret = nullptr;
    int n = pthread_join(tid, &ret);
    std::cout << "new thread exit code: " << (long long int)ret << ", n: " << n <<  std::endl;
    return 0;
}

// class ThreadDate
// {
// public:
//     ThreadDate(){}
//     void Init(int a, int b, std::string name)
//     {
//         _a = a;
//         _b = b;
//         _name = name;
//     }
//     int Result()    {return _a + _b; }
//     std::string Name(){return _name;}
//     void SetId(pthread_t id)
//     {
//         _tid = id;
//     }
//     pthread_t Id(){return _tid;}
//     int A(){return _a;}
//     int B(){return _b;}
//     ~ThreadDate(){}
// private:
//     int _a;
//     int _b;
//     int _result;
//     std::string _name;
//     pthread_t _tid;
// };

// void* routine(void* args)
// {
//     ThreadDate* td = static_cast<ThreadDate*>(args);

//     std::cout << "我是新线程,我的名字是: " << td->Name() << std::endl;
//     return nullptr;
// }

// #define NUM 5
// int main()
// {
//     ThreadDate td[NUM];
//     // 预处理
//     for(int i = 0;i < NUM;i++)
//     {
//         char id[64];
//         snprintf(id, sizeof(id), "thread-%d", i);
//         td[i].Init(i * 10, i * 20, id);
//     }
//     // 创建多个线程
//     for(int i = 0;i < NUM;i++)
//     {
//         pthread_t tid;
//         pthread_create(&tid, nullptr, routine, &td[i]);
//         td[i].SetId(tid);
//     }
//     // 等待多个线程
//     for(int i = 0;i < NUM;i++)
//     {
//         pthread_join(td[i].Id(), nullptr);
//     }
//     // 汇总处理结果
//     for(int i =0;i < NUM; i++)
//     {
//         printf("td[%d]: %d+%d=%d[%ld]\n", i, td[i].A(), td[i].B(), td[i].Result(), td[i].Id());
//     }
//     return 0;
// }

// int gval = 100;
// std::string toHex(pthread_t tid)
// {
//     // 4. 进程内的函数，线程共享
//     char buffer[64];
//     snprintf(buffer, sizeof(buffer), "0x%lx", tid);
//     return buffer;
// }
// void* routine1(void* args)
// {
//     std::string name = static_cast<const char*>(args);
//     while(true)
//     {
//         // std::cout << "我是新线程..." << name << ", my tid is : " << toHex(pthread_self()) << "， 全局变量(会修改)：" << gval << std::endl;
//         std::cout  << "我是新线程..." << toHex(pthread_self()) << std::endl;

//         gval++;
//         sleep(1);
//         break;
//     }
//     return (void*)10;
// }
// void* routine2(void* args)
// {
//     std::string name = static_cast<const char*>(args);
//     while(true)
//     {
//         std::cout << "我是新线程..." << name << ", my tid is : " << toHex(pthread_self()) << "， 全局变量(检测)：" << gval << std::endl;
//         std::cout  << "我是新线程..." << toHex(pthread_self()) << std::endl;
//         sleep(1);
//     }
//     return nullptr;
// }
// int main()
// {
//     pthread_t tid1;
//     pthread_create(&tid1, nullptr, routine1, (void*)"thread-1");

//     void *ret = nullptr;
//     int n = pthread_join(tid1, &ret);
//     // if(n != 0)
//     // {
//     //     std::cerr << "join error: "<< n << ", " << strerror(n) << std::endl;
//     // }
//     std::cout << "join success!, ret: " << (long long int)ret << std::endl;
//     // pthread_t tid2;
//     // pthread_create(&tid2, nullptr, routine2, (void*)"thread-2");
//     while(true)
//     {
//         std::cout << "我是main..." << std::endl;
//         sleep(1);
//     }
//     return 0;
// }

// 新线程
// void *run(void *args)
// {
//     while(true)
//     {
//         std::cout << "new thread, pid: " << getpid() << std::endl;
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
//     std::cout << "我是一个进程: " << getpid() << std::endl;
//     pthread_t tid;
//     pthread_create(&tid, nullptr, run, (void*)"thread-1");

//     // 主线程
//     while(true)
//     {
//         std::cout << "main thread, pid: "<< getpid() << std::endl;
//         sleep(1);
//     }

//     return 0;
// }